package com.demo.common;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 类型Format工具类
 * 
 * @author ryuu.kk
 *
 */
public final class FormatUtils {

	//private class
	private FormatUtils() {
		
	}

	/**
	 * 自动替换并填充字符串的函数
	 * @param str
	 * @return
	 */
	@SuppressWarnings("unused")
	private static final Map<String, Object> getAnArrayWithBracesInString(String format) {
		Map<String, Object> map = new HashMap<String, Object>();
		//java的正则表达式api包的方法，这里的意思是匹配{...}
		Pattern p = Pattern.compile("\\{[^}]+\\}");
		//与给的的字符串匹配
	    Matcher m = p.matcher(format);
	    //是否能匹配到
	    boolean result = m.find();
	    int i = 0;
	    StringBuffer sb = new StringBuffer();
	    List<String> list = new ArrayList<String>();;
        while(result) {
            //System.out.println(m.group());
            //匹配到将匹配的大括号连同里面的内容添加到list中
            list.add(m.group());
            //将大括号及里面的内容替换成{i}
            m.appendReplacement(sb, "{" + i + "}");
            //System.out.println(m.matches()+", "+"第"+i+"次匹配后sb的内容是："+sb);
            //继续查找下一个匹配对象
            result = m.find();
            i++;
        }
        map.put("list", list);
        if ((sb.toString()).equals("")) {
        	map.put("str", format.toString());
        } else {
        	map.put("str", sb.toString());
        }
		return map;
	}

	/**
	 * 字符串替换方法
	 * 使用[#xxx]作为替换原则
	 * 其中xxx为map的key或pojo方法
	 * @param formatStr format字符串
	 * @param args 数据
	 * @return String 替换后字符串
	 */
	public static final String format(String formatStr, Map<String, Object> args) {
		//java的正则表达式api包的方法，这里的意思是匹配任何以[#...]的内容
		Pattern p = Pattern.compile("\\[\\#[^]]+\\]");
		//与给的的字符串匹配
	    Matcher m = p.matcher(formatStr);
	    //是否能匹配到
	    boolean result = m.find();
	    StringBuffer sb = new StringBuffer();
        while(result) {
        	String originalChar = m.group().replace("[#", "").replace("]", "");
            Object objectContent = args.get(originalChar);
            m.appendReplacement(sb, objectContent == null ? "" : objectContent.toString());
            //继续查找下一个匹配对象
            result = m.find();
        }
        m.appendTail(sb);
		return sb.toString();
	}

	/**
	 * 字符串替换方法
	 * 使用[#xxx]作为替换原则
	 * 其中xxx为map的key或pojo方法
	 * @param formatStr format字符串
	 * @param args 数据
	 * @return String 替换后字符串
	 */
	public static final String format(String formatStr, List<Object> args) {
		StringBuffer sb = new StringBuffer();
		
		for (Object obj : args) {
			//java的正则表达式api包的方法，这里的意思是匹配任何以[#...]的内容
			Pattern p = Pattern.compile("\\[\\#[^]]+\\]");
			//与给的的字符串匹配
		    Matcher m = p.matcher(formatStr);
		    //是否能匹配到
		    boolean result = m.find();
		    
	        while(result) {
	        	String originalChar = m.group().replace("[#", "").replace("]", "");
	            String methodName = "get" + originalChar.substring(0,1).toUpperCase() + originalChar.substring(1); 
	            Method method;
	            String objectContent = "";
				try {
					method = obj.getClass().getMethod(methodName);
					objectContent = (String) method.invoke(obj);
				} catch (Exception e) {
					e.printStackTrace();
				} 
	            m.appendReplacement(sb, objectContent == null ? "" : objectContent.toString());
	            //继续查找下一个匹配对象
	            result = m.find();
	        }
	        m.appendTail(sb);
        }
		return sb.toString();
	}
	
	/**
	 * 取得对象关键字Key的列表
	 * 使用[#xxx]作为替换原则
	 * 其中xxx为map的key或pojo方法
	 * @param formatStr format字符串
	 * @return String 替换后字符串
	 */
	public static final String[] keywords(String formatStr) {
		//java的正则表达式api包的方法，这里的意思是匹配任何以[#...]的内容
		Pattern p = Pattern.compile("\\[\\#[^]]+\\]");
		//与给的的字符串匹配
	    Matcher m = p.matcher(formatStr);
	    //是否能匹配到
	    boolean result = m.find();
	    StringBuffer sb = new StringBuffer();
	    List<String> keyList = new ArrayList<String>();
        while(result) {
        	String originalChar = m.group().replace("[#", "").replace("]", "");
            keyList.add(originalChar);
            //继续查找下一个匹配对象
            result = m.find();
        }
        m.appendTail(sb);
		return keyList.toArray(new String[]{});
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("name","张三");
		map.put("age",18);
		//map.put("sex","男");
		String resultString = format("员工简历 姓名[#name],年龄[#age],性别[#sex] ?[#]? name:[name], sex#[sex], [sex#]  [s#ex] ?[#name]...", map);
		System.out.println(resultString);
		
		
		System.out.println(Integer.MAX_VALUE);
	}
}
